/* eslint-disable no-unused-vars */
import Map from 'ol/Map'

import type { IViewerOptions, ProjCode } from './types'

/**
 * 定义gis平台枚举常量。
 */
export enum Platform {
  /**  cesium ce */
  CESIUM = 'cesium',
  /**   cesium ce  */
  CE = 'ce',

  /** openLayers ol */
  OPENLAYERS = 'openLayers',
  /** openLayers ol */
  OL = 'ol',
}

/**
 * 定义地图事件枚举常量。
 */
export enum Event {
  /** 点击事件 */
  CLICK = 'click',

  /** 单击事件 */
  SINGLE_CLICK = 'singleClick',

  /** 双击事件 */
  DOUBLE_CLICK = 'dblclick',

  /** 鼠标按下事件 */
  MOUSE_DOWN = 'mousedown',

  /** 鼠标抬起事件 */
  MOUSE_UP = 'mouseup',

  /** 鼠标移动事件 */
  MOUSE_MOVE = 'mousemove',

  /** 鼠标悬停事件 */
  MOUSE_HOVER = 'mouseHover',

  /** 维度变化事件 */
  DIMENSION_CHANGED = 'dimensionChanged',

  /** 范围变化事件 */
  EXTENT_CHANGED = 'extentChanged',

  /** 鼠标滚轮事件 */
  WHEEL = 'wheel',

  /** 缩放事件 */
  ZOOM = 'zoom',

  /** 缩放结束事件 */
  ZOOM_END = 'zoomEnd',

  /** 地图准备完成事件 */
  READY = 'ready',

  /** 地图释放事件 */
  DISPOSE = 'dispose',

  /** 地图销毁事件 */
  DESTROY = 'destroy',
}

/**
 * 定义gis情景枚举常量。
 */
export enum Scene {
  /** 台风情景 */
  TYPHOON = 'typhoon',
}

/**
 * 定义地图派发地图事件时，需要从地图中选取内容的常量。
 * 用以节省资源开销（部分事件不需要选取图形元素）。
 */
export const Pick = {
  /** 不选取任何内容 */
  NONE: 0,

  /** 选取图形元素 */
  GRAPHIC: 1,

  /** 选取当前地图边界 */
  EXTENT: 2,
} as const

/**
 * 定义具体事件需要选取的内容。
 */
export const EventPick = {
  [Event.CLICK]: Pick.GRAPHIC | Pick.EXTENT,
  [Event.SINGLE_CLICK]: Pick.GRAPHIC | Pick.EXTENT,
  [Event.ZOOM]: Pick.EXTENT,
  [Event.EXTENT_CHANGED]: Pick.EXTENT,
  [Event.MOUSE_MOVE]: Pick.NONE,
  [Event.DOUBLE_CLICK]: Pick.GRAPHIC | Pick.EXTENT,
} as const

/**
 * 定义绘图的计算规格，即绘图中或者结束后需要提供的规格。
 */
export enum Specs {
  /** 不需要规格 */
  NONE = 0,

  /** 计算半径 */
  RADIUS = 1,

  /** 计算长度 */
  LENGTH = 2,

  /** 计算面积 */
  AREA = 4,

  /** 分段计算长度（多用于折线） */
  SPLIT = 8,

  /** 计算体积 */
  VOLUME = 32,

  /** 计算所有规格 */
  ALL = -1,
}

/**
 * 定义图形元素的类型。
 */
export enum Graphic {
  /** 点 */
  POINT = 'point',

  /** 广告牌 */
  BILLBOARD = 'billboard',

  /** 折线 */
  POLYLINE = 'polyline',

  /** 多边形 */
  POLYGON = 'polygon',

  /** 覆盖物 */
  OVERLAY = 'overlay',

  /** 文字 */
  TEXT = 'text',

  /** 标记 */
  MARK = 'mark',

  /** 光标 */
  CURSOR = 'cursor',
}

/**
 * 定义可绘制的图形类型。
 */
export enum DrawShape {
  /** 标记 */
  MARK = 'mark',

  /** 圆 */
  CIRCLE = 'circle',

  /** 折线 */
  POLYLINE = 'polyline',

  /** 多边形 */
  POLYGON = 'polygon',
}

/**
 * 地球半径常量，单位：米。
 */
export const EARTH_RADIUS = 6378137.0

export type GisKey = PropertyKey

/**
 * 定义默认的地图key引用。
 *
 * 地图key是用来区分地图的唯一值，
 * 不同地图对应不同的key，使用地图api时需要提供key，
 * 以确保操作作用在正确的地图上。
 */
export const KEY = Symbol('map.key.ol')

/**
 * Cesium 地图key。
 */
export const KEY_CE = Symbol('map.key.cesium')

/**
 * 地图封装对象，用于保存地图的核心对象和状态。
 */
export type GisRef = {
  /** 地图平台类型 */
  platform: Platform

  /** 地图使用的投影坐标系 */
  projection: ProjCode

  /** 地图初始配置对象 */
  config: IViewerOptions

  /** 缓存对象，用于存放地图相关的资源和图层 */
  cache: { [key: string | number]: unknown }

  /** 当前地图实例的唯一标识符key */
  key: symbol

  /**
   * 底图信息对象，至少包含名称
   * // FIXME baseLayer 更好
   */
  basemap: { name: string | null }
  /**
   * 销毁地图
   * @returns
   */
  dispose: () => Promise<true>

  /** Cesium 的 Viewer 对象（仅Cesium平台有效） */
  //viewer?: Viewer

  /** OpenLayers 的 Map 对象（仅OpenLayers平台有效） */
  map?: Map

  /** 3D SDK对象（如 EcCesium 实例） */
  //sdk?: EcCesium

  /** Viewer 容器元素 */
  viewerContainer?: HTMLElement
}
